package com.hantanger.weblog.util;

import java.util.List;
import java.util.Map;

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;
import com.googlecode.objectify.cmd.Deleter;
import com.googlecode.objectify.cmd.Loader;
import com.googlecode.objectify.cmd.Saver;
import com.hantanger.weblog.model.Archive;
import com.hantanger.weblog.model.Category;
import com.hantanger.weblog.model.Comment;
import com.hantanger.weblog.model.Post;
import com.hantanger.weblog.model.PostCount;
import com.hantanger.weblog.model.Setting;
import com.hantanger.weblog.model.Tag;
import com.hantanger.weblog.model.User;

public final class DaoHelper {
	
	static{
		ObjectifyService.register(Archive.class);
		ObjectifyService.register(Category.class);
		ObjectifyService.register(Comment.class);
		ObjectifyService.register(Post.class);
		ObjectifyService.register(PostCount.class);
		ObjectifyService.register(Setting.class);
		ObjectifyService.register(Tag.class);
		ObjectifyService.register(User.class);
	}

	public static Objectify getObjectify() {
		return ObjectifyService.ofy();
	}
	
	public static Saver getSaver(){
		return getObjectify().save();
	}
	
	public static <E> void save(E ... entities) {
		getSaver().entities(entities).now();
	}
	
	public static Deleter getDeleter(){
		return getObjectify().delete();
	}
	
	public static <E> void deleteEntities(E ... entities) {
		getDeleter().entities(entities).now();
	}
	
	public static <E> void delete(Class<E> clazz, long ... ids) {
		getDeleter().type(clazz).ids(ids).now();
	}
	
	public static <E> void delete(Class<E> clazz, String ... ids) {
		getDeleter().type(clazz).ids(ids).now();
	}
	
	public static Loader getLoader(){
		return getObjectify().load();
	}
	
	public static <E> E get(Class<E> clazz, long id){
		return getLoader().type(clazz).id(id).get();
	}
	
	public static <E> E get(Class<E> clazz, String id){
		return getLoader().type(clazz).id(id).get();
	}
	
	public static <E> Map<Long, E> getMap(Class<E> clazz, List<Long> ids){
		return getLoader().type(clazz).ids(ids);
	}
}